home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1997 August / Macworld (1997-08).dmg / Shareware World / Info / For Developers / InstallerMaker™ 4.0 Installer / Customizing InstallerMaker / Scripting InstallerMaker / Text Files / Log Archive to BBEdit < prev    next >
Text File  |  1996-02-01  |  14KB  |  507 lines

  1. (*
  2.  
  3. Archive logging script, version 2
  4.  
  5. A demo script for InstallerMaker 3.0's new scripting features.
  6.  
  7. We don't guarantee that this script is fit for any purpose, but you can
  8. learn quite a lot about AppleScript in general and using AppleScript with
  9. InstallerMaker by reading this.
  10.  
  11. This script assumes that it's working on the frontmost archive, and doesn't
  12. have the necessary error checking to make sure that the user hasn't messed
  13. with the order of the archive windows.  A more general script than this one
  14. would probably check for that possibility.
  15.  
  16. 12/7/95, RMT
  17.  
  18. *)
  19.  
  20. -- For diagnostic purposes, this version does logging to BBEdit
  21. on ExistsBBWin()
  22.     set itExists to true
  23.     tell application "BBEdit 3.5"
  24.         try
  25.             copy (name of window 1) to theNULL
  26.         on error err
  27.             set itExists to false
  28.         end try
  29.     end tell
  30.     
  31.     return itExists
  32. end ExistsBBWin
  33.  
  34. on SaveThisFile(logPath)
  35.     tell application "BBEdit 3.5" to save window 1 to file logPath
  36. end SaveThisFile
  37.  
  38. on LogText(someText)
  39.     --Small utility for printing lines to the Scriptable Text Editor
  40.     set hasWindow to false
  41.     if ExistsBBWin() then
  42.         set hasWindow to true
  43.     end if
  44.     
  45.     tell application "BBEdit 3.5"
  46.         --activate
  47.         if not hasWindow then ¬
  48.             create window
  49.         tell window 1
  50.             Insert Text (someText as string) & return
  51.         end tell
  52.     end tell
  53. end LogText
  54.  
  55.  
  56. on PointString(pointList)
  57.     return "{" & item 1 of pointList & ¬
  58.         "," & item 2 of pointList & "}"
  59. end PointString
  60.  
  61. on FormatListOfString(strList)
  62.     copy (count of strList) to cnt
  63.     
  64.     copy "{" to str
  65.     
  66.     if cnt > 0 then
  67.         
  68.         if cnt > 1 then
  69.             repeat with i from 1 to cnt - 1
  70.                 copy str & "\"" & item i of strList & "\"" & "," to str
  71.             end repeat
  72.         end if
  73.         copy str & "\"" & item cnt of strList & "\"" & "}" to str -- last item, so no comma
  74.         
  75.     else
  76.         copy "{}" to str
  77.     end if
  78.     
  79.     return str
  80. end FormatListOfString
  81.  
  82. on PrintClassItem(prefix, itemRef)
  83.     
  84.     tell application "StuffIt Installer™ 3.0"
  85.         copy name of itemRef to itsName
  86.         copy type of itemRef to itsType
  87.         copy (creation date of itemRef) to createDate
  88.         copy (modification date of itemRef) to modDate
  89.         
  90.         tell me
  91.             copy createDate as string to itsCreateDate
  92.             copy modDate as string to itsModDate
  93.         end tell
  94.         
  95.         copy size of itemRef to itsDiskSize
  96.         copy compressed size of itemRef to itsCompressedSize
  97.         copy label of itemRef to itsFinderLabel
  98.         copy compressed of itemRef to isCompressed
  99.         copy encrypted of itemRef to isEncrypted
  100.         --copy top level of itemRef to isTopLevel
  101.         copy user tag of itemRef to itsUserTag
  102.         copy position of itemRef to itsPositionPoint
  103.         --copy parent  of itemRef to itsParRef
  104.         copy item number of itemRef to itsIndex
  105.     end tell
  106.     
  107.     tell me
  108.         LogText(prefix)
  109.         LogText(prefix & "#" & itsIndex)
  110.         LogText(prefix & "Name: \"" & itsName)
  111.         LogText(prefix & "==============================")
  112.         LogText(prefix & "Properties from Class Item")
  113.         LogText(prefix & "==============================")
  114.         LogText(prefix & "Type: " & itsType)
  115.         LogText(prefix & "Size on disk: " & itsDiskSize)
  116.         LogText(prefix & "Size in archive: " & itsCompressedSize)
  117.         
  118.         if isCompressed then
  119.             set str to "Item is compressed"
  120.         else
  121.             set str to "Item is not compressed"
  122.         end if
  123.         
  124.         LogText(prefix & str)
  125.         
  126.         if isEncrypted then
  127.             set str to "Item is encrypted"
  128.         else
  129.             set str to "Item is not encrypted"
  130.         end if
  131.         
  132.         LogText(prefix & str)
  133.         
  134.         
  135.         LogText(prefix & "Item was Created on: " & itsCreateDate)
  136.         LogText(prefix & "Item was Last Modified on: " & itsModDate)
  137.         
  138.         copy PointString(itsPositionPoint) to ptStr
  139.         LogText(prefix & "Position in Finder Window: " & ptStr)
  140.         
  141.         LogText(prefix & "User Tag: " & itsUserTag)
  142.     end tell
  143.     
  144. end PrintClassItem
  145.  
  146.  
  147. on PrintClassTopLevel(prefix, itemRef)
  148.     --I assume that the caller has actually tested the item, and is sure it's top level material
  149.     tell application "StuffIt Installer™ 3.0"
  150.         copy package definition of itemRef to packList -- note this is new in 3.0b1
  151.         copy version condition of itemRef to itsVersCondit
  152.         if itsVersCondit is "range" then
  153.             copy version range condition of itemRef to itsVersRange
  154.         else
  155.             copy {} to itsVersRange
  156.         end if
  157.         
  158.         copy existing file condition of itemRef to itsExistsCondit
  159.         copy Gestalt condition of itemRef to itsGestaltRec
  160.         copy system condition of itemRef to itsSysCondit
  161.         copy display condition of itemRef to itsDisplayCondit
  162.         copy processor condition of itemRef to itsProcCondit
  163.         copy custom condition of itemRef to itsCustCondit
  164.     end tell
  165.     
  166.     copy FormatListOfString(packList) to packStr
  167.     
  168.     LogText(prefix & "==============================")
  169.     LogText(prefix & "Top Level Settings")
  170.     LogText(prefix & "==============================")
  171.     LogText(prefix & "Assigned to Packages: " & packStr)
  172.     LogText(prefix & "File Exists Test: " & itsExistsCondit)
  173.     LogText(prefix & "Version Test Type: " & itsVersCondit)
  174.     LogText(prefix & "System Class Test: " & itsSysCondit)
  175.     LogText(prefix & "Display Type Test: " & itsDisplayCondit)
  176.     LogText(prefix & "Processor Type Test: " & itsProcCondit)
  177.     LogText(prefix & "Custom Condition Bits: " & itsCustCondit)
  178.     --LogText(prefix & "xxx: " & xx )
  179.     
  180.     --return packList
  181.     
  182. end PrintClassTopLevel
  183.  
  184.  
  185. on NewTLItemBoarder()
  186.     LogText("============================================================")
  187. end NewTLItemBoarder
  188.  
  189. on LogGestaltCondition(prefix, theGestalt)
  190.     --This examine a gestalt record and prints it out in a human readable form
  191.     tell application "StuffIt Installer™ 3.0"
  192.         set selectorStr to ""
  193.         set conditStr to ""
  194.         
  195.         -- The only safe way to test a record for entries
  196.         -- is to use try handlers.
  197.         
  198.         -- Find out what we've selected:
  199.         try
  200.             copy "Selector Exists: " & ¬
  201.                 given selector exists and condition met of theGestalt to selectorStr
  202.         on error
  203.             try
  204.                 copy "Selector Does Not Exist: " & ¬
  205.                     given selector does not exist of theGestalt to selectorStr
  206.             on error
  207.                 try
  208.                     copy "Selector Does Not Exist (w/Condition): " & ¬
  209.                         given selector does not exist or condition of theGestalt to selectorStr
  210.                 on error
  211.                     copy "<No Selector>" to selectorStr
  212.                 end try
  213.             end try
  214.         end try
  215.         
  216.         
  217.         -- Check for conditions
  218.         try
  219.             copy "Data = " & ¬
  220.                 data equal of theGestalt to conditStr
  221.         on error
  222.             try
  223.                 copy "Data ≠ " & ¬
  224.                     data not equal of theGestalt to conditStr
  225.             on error
  226.                 try
  227.                     copy "Bit Mask (Set): " & ¬
  228.                         bits set of theGestalt to conditStr
  229.                 on error
  230.                     try
  231.                         copy "Bit Mask (Not Set): " & ¬
  232.                             bits clear of theGestalt to conditStr
  233.                     on error
  234.                         try
  235.                             copy "Data ≥ " & ¬
  236.                                 data greater than or equal of theGestalt to conditStr
  237.                         on error
  238.                             try
  239.                                 copy "Data ≤ " & ¬
  240.                                     data less than or equal of theGestalt to conditStr
  241.                             on error
  242.                                 copy "<No Condition>" to conditStr
  243.                             end try
  244.                         end try
  245.                     end try
  246.                 end try
  247.             end try
  248.         end try
  249.         
  250.     end tell
  251.     
  252.     LogText(prefix & "Gestalt Selector and Condition Tests:")
  253.     LogText(prefix & selectorStr)
  254.     LogText(prefix & conditStr)
  255.     return {selectorStr, conditStr}
  256.     
  257. end LogGestaltCondition
  258.  
  259.  
  260. on PrintArchiveInfo(arcRef)
  261.     NewTLItemBoarder()
  262.     LogText("")
  263.     
  264.     --Now get some info about the archive
  265.     tell application "StuffIt Installer™ 3.0"
  266.         copy archive name of arcRef to arcName
  267.         copy pathname of arcRef to arcPath
  268.         copy language of arcRef to arcLang
  269.         copy linked resources of arcRef to linkedRes
  270.         copy version to appVers
  271.     end tell
  272.     
  273.     LogText("Archive: " & arcName)
  274.     LogText("Type: InstallerMaker " & appVers & " archive")
  275.     LogText("Location on Disk: " & arcPath)
  276.     LogText("Prepared in Language: " & arcLang)
  277.     LogText("Using Included Resource File: " & linkedRes)
  278.     LogText("")
  279.     NewTLItemBoarder()
  280. end PrintArchiveInfo
  281.  
  282. on LogMinimumSystem(prefix, minSysRec)
  283.     --Packages may have an empty record if min sys feature not used
  284.     if minSysRec is {} then
  285.         LogText("prefix & [No Minimum System Conditions Defined]")
  286.         return
  287.     end if
  288.     
  289.     --Otherwise everything is defined, and is true or false
  290.     
  291.     tell application "StuffIt Installer™ 3.0"
  292.         --We get back a version integer.  We'll parse it.
  293.         copy minimum System Version of minSysRec to sysInt
  294.         copy ((sysInt) div 256) to majorRev
  295.         copy (sysInt - majorRev * 256) div 16 to subRev
  296.         copy (sysInt - majorRev * 256 - subRev * 16) to fixRev
  297.         
  298.         copy (majorRev as string) & "." & subRev & "." & fixRev to verStr
  299.         tell me to LogText(prefix & "Minimum System Version: " & verStr)
  300.         
  301.         copy minimum RAM of minSysRec to minRAM
  302.         tell me to LogText(prefix & "Physical RAM required: " & minRAM & "K")
  303.         
  304.         
  305.         (*
  306.         
  307.         -- This section is disabled, due to a terminology conflict on
  308.         -- "dont allow override".
  309.         
  310.         if dont allow override of warning of minSysRec then
  311.             tell me to LogText ("Require These Conditions for Installation:")
  312.         else
  313.             tell me to LogText ("Warn User If These Conditions Not Met:")
  314.         end if 
  315.     *)
  316.         tell me to LogText(prefix & "Check for Conditions:")
  317.         
  318.         if requires ColorQuickDraw of minSysRec then
  319.             tell me to LogText(prefix & "ColorQuickDraw")
  320.         end if
  321.         
  322.         set someConditSet to false
  323.         
  324.         if requires ColorQuickDraw32 of minSysRec then
  325.             tell me to LogText(prefix & "ColorQuickDraw32")
  326.             set someConditSet to true
  327.         end if
  328.         
  329.         if requires CPU020 of minSysRec then
  330.             tell me to LogText(prefix & "68020 Equivalent or Better")
  331.             set someConditSet to true
  332.         end if
  333.         
  334.         if requires MMU of minSysRec then
  335.             tell me to LogText(prefix & "MMU")
  336.             set someConditSet to true
  337.         end if
  338.         
  339.         if requires FPU of minSysRec then
  340.             tell me to LogText(prefix & "FPU")
  341.             set someConditSet to true
  342.         end if
  343.         
  344.         
  345.         if requires QuickTime of minSysRec then
  346.             tell me to LogText(prefix & "QuickTime")
  347.             set someConditSet to true
  348.         end if
  349.         
  350.         
  351.         if requires PowerManager of minSysRec then
  352.             tell me to LogText(prefix & "PowerManager")
  353.             set someConditSet to true
  354.         end if
  355.         
  356.         
  357.         if requires PowerTalk of minSysRec then
  358.             tell me to LogText(prefix & "PowerTalk")
  359.             set someConditSet to true
  360.         end if
  361.         
  362.         
  363.         if requires PowerPC of minSysRec then
  364.             tell me to LogText(prefix & "PowerPC")
  365.             set someConditSet to true
  366.         end if
  367.         
  368.         
  369.         if requires Color Capable of minSysRec then
  370.             tell me to LogText(prefix & "Color Capable Monitor")
  371.             set someConditSet to true
  372.         end if
  373.         
  374.         copy Gestalt condition of minSysRec to itsGestalt
  375.         
  376.         if itsGestalt is not {} then
  377.             tell me to LogGestaltCondition(prefix, itsGestalt)
  378.             set someConditSet to true
  379.         end if
  380.         
  381.         if not someConditSet then
  382.             tell me to LogText(prefix & "[No Conditions Specified]")
  383.         end if
  384.         
  385.     end tell
  386.     
  387. end LogMinimumSystem
  388.  
  389. on PrintGlobalInfo(arcRef)
  390.     LogText("")
  391.     LogText("**Global Data For This Archive**")
  392.     LogText("Minimum Conditions for Installation:")
  393.     
  394.     tell application "StuffIt Installer™ 3.0"
  395.         copy minimum system of arcRef to theMinSysRec
  396.     end tell
  397.     LogMinimumSystem("> ", theMinSysRec)
  398.     
  399. end PrintGlobalInfo
  400.  
  401. on PrintPackageInfo(arcRef)
  402.     LogText("[Package info is broken in 3.0a3]")
  403. end PrintPackageInfo
  404.  
  405.  
  406. on ProcessSubFolder(prefix, folderRef)
  407.     tell me
  408.         LogText(prefix, "[We'd print subitems here, and recurse if needed]")
  409.     end tell
  410.     
  411.     set myPrefix to prefix & "|---"
  412.     
  413.     tell application "StuffIt Installer™ 3.0"
  414.         
  415.         set current folder of archive 1 to folderRef -- Deal with a bug in 3.0b1 that confuses
  416.         ----------------------------------------------- count and item number for a closed folder
  417.         
  418.         copy (count of items in folderRef) to theCount
  419.         
  420.         if theCount is 0 then
  421.             tell me to LogText("[No items in archive]")
  422.         else
  423.             tell me to LogText(myPrefix & theCount & " items in this folder.")
  424.             repeat with i from 1 to theCount
  425.                 tell application "StuffIt Installer™ 3.0"
  426.                     copy (a reference to item i of folderRef) to thisItem
  427.                     copy type of thisItem to itsType
  428.                 end tell
  429.                 
  430.                 tell me
  431.                     PrintClassItem(myPrefix, thisItem)
  432.                     
  433.                     if itsType is "folder" then
  434.                         beep 2
  435.                         ProcessSubFolder(myPrefix, thisItem)
  436.                         tell application "StuffIt Installer™ 3.0"
  437.                             set current folder of archive 1 to folderRef
  438.                         end tell
  439.                         
  440.                     else
  441.                         LogText(myPrefix & "Type is not folder, but \"" & itsType & "\"")
  442.                     end if
  443.                 end tell
  444.                 
  445.             end repeat
  446.         end if
  447.     end tell
  448.     
  449.     
  450. end ProcessSubFolder
  451.  
  452. on ProcessTopLevel(arcRef)
  453.     --This one starts the printout of archive item information.
  454.     tell application "StuffIt Installer™ 3.0"
  455.         if class of arcRef is not archive then
  456.             error "Don't call this handler for non-archives!"
  457.         end if
  458.         
  459.         set current folder of arcRef to arcRef -- there's a bug in get item number!
  460.         
  461.         copy (count of items in arcRef) to theCount
  462.         
  463.         if theCount is 0 then
  464.             tell me to LogText("[No items in archive]")
  465.         else
  466.             tell me to LogText(theCount & " items at top level.")
  467.             
  468.             repeat with i from 1 to theCount
  469.                 copy (a reference to top level item i of arcRef) to thisItem
  470.                 copy type of thisItem to itsType
  471.                 tell me
  472.                     PrintClassItem("", thisItem)
  473.                     PrintClassTopLevel("", thisItem)
  474.                     
  475.                     if itsType is "folder" then
  476.                         beep 2
  477.                         tell application "StuffIt Installer™ 3.0"
  478.                             copy (a reference to folder i of arcRef) to aFldrRef
  479.                         end tell
  480.                         
  481.                         
  482.                         ProcessSubFolder("", aFldrRef)
  483.                         
  484.                         tell application "StuffIt Installer™ 3.0"
  485.                             set current folder of arcRef to arcRef
  486.                         end tell
  487.                     else
  488.                         LogText("Type is not folder, but \"" & itsType & "\"")
  489.                     end if
  490.                 end tell
  491.             end repeat
  492.         end if
  493.     end tell
  494.     
  495. end ProcessTopLevel
  496. --Start execution here....
  497.  
  498. tell application "StuffIt Installer™ 3.0"
  499.     copy (a reference to archive 1) to arcRef
  500.     tell me to PrintArchiveInfo(arcRef)
  501. end tell
  502.  
  503. PrintGlobalInfo(arcRef)
  504. LogText("")
  505. PrintPackageInfo(arcRef)
  506. LogText("")
  507. --ProcessTopLevel(arcRef)